package net.interneteidee.entity;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.constraints.Range;

@XmlRootElement
@Entity
public class Ordine {

	@Id
	@GeneratedValue
	private long idOrdine;

	@Column(unique = true)
    @Range(min=1 , max=2000 ,message="Codice Ordine non corretto")
	private long codiceOrdine;

	@Temporal(TemporalType.DATE)
	@NotNull(message="Data accettazione non selezionata")
	private Date dataAccettazione;

	@Temporal(TemporalType.DATE)
	@NotNull(message="Data consegna non selezionata")
	private Date dataConsegna;

	private String note;

	private String tipoPagamento;

	private String stato;

	private double importoTotale;
	
	

	@ManyToOne
	@JoinColumn(name = "cliente_fk")
	@NotNull(message="Cliente non può essere nullo")
	private Cliente cliente;

	@ManyToMany
	@JoinTable(name = "ordine_fattura", joinColumns = @JoinColumn(name = "ordine_fk"), inverseJoinColumns = @JoinColumn(name = "fattura_fk"))
	private List<Fattura> fatture = new LinkedList<Fattura>();

	@OneToMany(fetch = FetchType.EAGER , cascade = {CascadeType.PERSIST , CascadeType.MERGE})
	@JoinColumn(name = "ordine_fk")
	private List<LineaOrdine> lineeOrdine = new LinkedList<LineaOrdine>();

	public Ordine() {
		// TODO Auto-generated constructor stub
	}


	public long getIdOrdine() {
		return idOrdine;
	}

	public void setIdOrdine(long idOrdine) {
		this.idOrdine = idOrdine;
	}

	public long getCodiceOrdine() {
		return codiceOrdine;
	}

	public void setCodiceOrdine(long codiceOrdine) {
		this.codiceOrdine = codiceOrdine;
	}

	public Date getDataAccettazione() {
		return dataAccettazione;
	}

	public void setDataAccettazione(Date dataAccettazione) {
		this.dataAccettazione = dataAccettazione;
	}

	public Date getDataConsegna() {
		return dataConsegna;
	}

	public void setDataConsegna(Date dataConsegna) {
		this.dataConsegna = dataConsegna;
	}

	public String getNote() {
		return note;
	}

	public void setNote(String note) {
		this.note = note;
	}

	public String getTipoPagamento() {
		return tipoPagamento;
	}

	public void setTipoPagamento(String tipoPagamento) {
		this.tipoPagamento = tipoPagamento;
	}

	public String getStato() {
		return stato;
	}

	public void setStato(String stato) {
		this.stato = stato;
	}


	public double getImportoTotale() {
		return importoTotale;
	}

	public void setImportoTotale(double importoTotale) {
		this.importoTotale = importoTotale;
	}

	@XmlTransient
	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	@XmlTransient
	public List<Fattura> getFatture() {
		return fatture;
	}

	public void setFatture(List<Fattura> fatture) {
		this.fatture = fatture;
	}

	@XmlTransient
	public List<LineaOrdine> getLineeOrdine() {
		return lineeOrdine;
	}

	public void setLineeOrdine(List<LineaOrdine> lineeOrdine) {
		this.lineeOrdine = lineeOrdine;
	}
	



	/**
	 * Aggiunge una fattura relativa all' ordine corrente
	 * 
	 * @param fattura
	 */
	public void addFattura(Fattura fattura) {
		fatture.add(fattura);
	}

	/**
	 * Agginge una linea ordine all' ordine corrente
	 * 
	 * @param lineaOrdine
	 */
	public void addLineaOrdine(LineaOrdine lineaOrdine) {
		lineeOrdine.add(lineaOrdine);
	}

}
